package QianFeng08.QueueDequeStackDemo;

import java.util.Deque;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;

/**
 * Queue接口：队列，是一种先进先出法的线性结构（排队）
 * LinkedList类实现了queue接口
 * 请求队列，消息队列，任务
 *
 * Deque接口：双端队列
 *
 * Stack类：堆栈
 * 后进先出（LIFO）堆对象。继承于Vector类
 **/
public class QueueDequeStack {
    public static void main(String[] args) {
        //queue();
        //deque();
        stack();
    }

    //Queue队列
    private static void queue() {
        Queue<String> queue = new LinkedList<>();
        queue.add("小花");
        queue.add("小黑");
        queue.add("小白");
        queue.add("小利");
        queue.add("小明");

        //检索，但不删除，这个队列头，或返回 null如果队列为空。
        System.out.println(queue.peek());//小花
        System.out.println(queue.size());//5
        //检索并移除此队列的头，或返回 null如果队列为空。
        System.out.println(queue.poll());//小花
        System.out.println(queue.size());//4


    }

    //Deque双端队列
    private static void deque() {
        Deque<String> deque = new LinkedList<>();
        deque.add("小花");
        deque.add("小黑");
        deque.add("小白");
        deque.add("小利");
        deque.add("小明");

        //检索，但不删除该deque容器的第一个元素，或返回 null如果队列是空的。
        System.out.println(deque.peekFirst());//小花
        //检索，但不删除该队列的最后一个元素，或返回 null如果队列是空的。
        System.out.println(deque.peekLast());//小明
        System.out.println(deque.size());//5
        //检索并移除此队列的头，或返回 null如果队列为空。
        System.out.println(deque.pollFirst());//小花
        System.out.println(deque.pollLast());//小明
        System.out.println(deque.size());//3
    }

    //Stack堆栈
    private static void stack() {
        Stack<String> stack = new Stack<>();
        //压榨，将项目push到堆栈顶部
        stack.push("Bin");
        stack.push("Tom");
        stack.push("Lin");
        //查看此堆栈顶部的对象，而不将它从堆栈中删除。
        System.out.println(stack.peek());//Lin
        //在这个堆栈的顶部删除对象，并返回该对象的值作为该函数的值。
        System.out.println(stack.pop());//Lin
        System.out.println(stack);//[Bin,Tom]
    }

}
